package SecondeStage.MianXiangDuiXiang.AbstractClass.CodeBlock;

public class StaticCodeBlock {
    // static代码块也叫静态代码块，对类进行初始化，它随着类的加载而执行，且只会执行一次
    // 类什么时候被加载：① 创建对象实例时 ② 创建子类对象实例，父类也会被加载 ③ 使用类的静态成员时
    public static void main(String[] args) {
//        // 类被加载的情况举例
//        // 1. 创建对象实例
//        AA a =new AA();
//        // 2.创建子类对象实例，父类也会被加载
//        BB b =new BB();
//        // 3.使用类的静态成员时
//        System.out.println(AA.name);
//        System.out.println("------------------------------------");

        // static代码块只会执行一次
        AA a2 =new AA();
        AA a3 =new AA();

        // 如果只是使用类的静态成员时，普通代码块不会执行
        // 普通代码块和类加载没有关系，只在new对象时被调用，且new一个对对象就调用一次
        System.out.println(CC.name);

    }
}

class AA{
    public static String name="小七";

    {
        System.out.println("AA的普通代码块被执行...");
    }

    static {
        System.out.println("AA的静态代码块被执行...");
    }
}

class BB extends AA{
    {
        System.out.println("BB的普通代码块被执行...");
    }
    static {
        System.out.println("BB的静态代码块被执行...");
    }
}

class CC{
    public static String name="小雪";

    {
        System.out.println("CC的普通代码块被执行...");
    }

    static {
        System.out.println("CC的静态代码块被执行...");
    }
}
